package reflection.class_;

import java.lang.reflect.Field;

/**
 * @author DCSGO
 * @version 1.0
 * Class 类常用方法1
 */
public class Class02 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        //1.获得一个类的 Class 类对象 | <?> 泛型通配符 表示任意泛型类型 即类型参数可以为任意引用类型
        Class<?> cls = Class.forName("car.Car");

        //2.输出 cls
        System.out.println(cls);//class car.Car -> 前缀 + getName()
        /*
        public String toString() {
            return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
                + getName();
        }
         */
        System.out.println(cls.getClass());//class java.lang.Class 运行类型

        //3.获得 Class 反射的类的包名
        System.out.println(cls.getPackage());//package car
        System.out.println(cls.getPackage().getName());//car

        //4.获得 Class 反射的类的类名
        System.out.println(cls.getName());//car.Car 全类名：包.类名
        System.out.println(cls.getSimpleName());//Car

        //5.通过 cls 创建对象实例
        Object o = cls.newInstance();
        System.out.println(o);//Car{brand='宝马', price=1000000, color='白色'}

        //6.获得 cls 反射的类的属性
        //  getField(属性名) 获得指定属性 该方法只能获得 public 修饰的属性
        Field brand = cls.getField("brand");
        //  field.get(Object obj) 返回obj对象的field
        System.out.println(brand.get(o));//宝马
        //  getFields() 获得 cls 反射的对象的所有 public 属性
        Field[] fields = cls.getFields();
        for (Field f : fields) {
            System.out.print(f.get(o) + " ");
        }//宝马 1000000 白色
        System.out.println();

        //7.设置 cls 创建的实例对象的属性 public void set(Object obj, Object value)
        brand.set(o, "奔驰");
        System.out.println(o);//Car{brand='奔驰', price=1000000, color='白色'}
    }
}
